home *** CD-ROM | disk | FTP | other *** search
/ Cre@te Online 2000 December / Cre@teOnline CD05.iso / MacSoft / XML ConsoleMax.sea / XML ConsoleMax / Required / esc.jar / com / extensibility / xml / DCDReader.class (.txt) < prev    next >
Encoding:
Java Class File  |  2000-06-30  |  11.7 KB  |  465 lines

  1. package com.extensibility.xml;
  2.  
  3. import com.extensibility.util.Debug;
  4. import com.extensibility.util.StringUtilities;
  5. import com.extensibility.xml.dt.DataType;
  6. import com.extensibility.xml.dt.DataTypeFactory;
  7. import java.io.IOException;
  8. import java.io.Reader;
  9. import java.util.Hashtable;
  10. import java.util.Stack;
  11. import java.util.Vector;
  12. import org.xml.sax.AttributeList;
  13. import org.xml.sax.HandlerBase;
  14. import org.xml.sax.InputSource;
  15. import org.xml.sax.Locator;
  16. import org.xml.sax.Parser;
  17. import org.xml.sax.SAXException;
  18. import org.xml.sax.SAXParseException;
  19. import org.xml.sax.helpers.LocatorImpl;
  20.  
  21. public final class DCDReader extends HandlerBase {
  22.    static final String TOPLEVEL_ELEMTYPE = "ElementDef";
  23.    static final String TOPLEVEL_ATTRTYPE = "AttributeDef";
  24.    static final String TOPLEVEL_NAMESPACE = "Namespace";
  25.    static final String TAG_ELEMENT = "Element";
  26.    static final String TAG_ATTRIBUTE = "Attribute";
  27.    static final String TAG_ATTR_VALUES = "Values";
  28.    static final String TAG_GROUP = "Group";
  29.    static final String TAG_COMMENT = "Description";
  30.    static final String TAG_INTERNAL_ENTITY = "InternalEntityDef";
  31.    static final String TAG_EXTERNAL_ENTITY = "ExternalEntityDef";
  32.    private Hashtable elemDecls;
  33.    private Hashtable currentAttrs;
  34.    private ElementDeclaration currentElemDecl;
  35.    private Vector elemDeclAttrs;
  36.    private Hashtable namespaces;
  37.    private AttributeDeclaration currentAttrDecl;
  38.    private SchemaIntf schema;
  39.    private ContentModel currentCM;
  40.    private boolean cmClosed;
  41.    private Stack cmConnectors;
  42.    private Stack contentModels;
  43.    private Object commentKind;
  44.    private String commentContent;
  45.    private boolean commentStart;
  46.    private String entityName;
  47.    private String entityValue;
  48.    private boolean internalGEStart;
  49.    private boolean elemStart;
  50.    private String elemRefName;
  51.    private boolean enumStart;
  52.    private String attrConstraints;
  53.    private boolean attrStart;
  54.    private String attrName;
  55.    private boolean nsStart;
  56.    private String nsUri;
  57.    private boolean isFirstGroup;
  58.    private boolean inProlog = true;
  59.    private Locator locator;
  60.  
  61.    public DCDReader(SchemaIntf var1) {
  62.       this.schema = var1;
  63.    }
  64.  
  65.    public void error(String var1, int var2, int var3, int var4) {
  66.       ParserException var5 = new ParserException(var2, var1);
  67.       var5.setSource(String.valueOf(String.valueOf(String.valueOf(String.valueOf("See Line: ").concat(String.valueOf(var3))).concat(String.valueOf(" Column:"))).concat(String.valueOf(var4))).concat(String.valueOf(" in file.")));
  68.       var5.setSourceLinePos(var3);
  69.       this.schema.addError(var5);
  70.    }
  71.  
  72.    public void error(SAXParseException var1) {
  73.       this.error(((SAXException)var1).getMessage(), 240, this.locator.getLineNumber(), this.locator.getColumnNumber());
  74.    }
  75.  
  76.    public void fatalError(SAXParseException var1) {
  77.       this.error(var1);
  78.    }
  79.  
  80.    public void setDocumentLocator(Locator var1) {
  81.       this.locator = var1;
  82.    }
  83.  
  84.    public void parse(URI var1) throws IOException {
  85.       Reader var3 = null;
  86.  
  87.       try {
  88.          Parser var2 = SchemaUtilities.getParser();
  89.          this.setDocumentLocator(new LocatorImpl());
  90.          var2.setEntityResolver(this);
  91.          var2.setErrorHandler(this);
  92.          var2.setDocumentHandler(this);
  93.          var3 = var1.createReader();
  94.          var2.parse(new InputSource(var3));
  95.       } catch (IOException var15) {
  96.          throw var15;
  97.       } catch (Exception var16) {
  98.          if (!(var16 instanceof IOException)) {
  99.          }
  100.       } finally {
  101.          try {
  102.             if (var3 != null) {
  103.                var3.close();
  104.             }
  105.          } catch (IOException var14) {
  106.          }
  107.  
  108.       }
  109.  
  110.    }
  111.  
  112.    public void startDocument() {
  113.       this.elemDecls = new Hashtable();
  114.       this.currentAttrs = new Hashtable();
  115.       this.currentElemDecl = null;
  116.       this.elemDeclAttrs = new Vector();
  117.       this.namespaces = new Hashtable();
  118.       this.currentAttrDecl = null;
  119.       this.cmClosed = false;
  120.       this.cmConnectors = new Stack();
  121.       this.contentModels = new Stack();
  122.       this.commentKind = null;
  123.       this.commentContent = null;
  124.       this.commentStart = false;
  125.       this.entityName = null;
  126.       this.entityValue = null;
  127.       this.internalGEStart = false;
  128.       this.elemStart = false;
  129.       this.elemRefName = null;
  130.       this.enumStart = false;
  131.       this.attrConstraints = null;
  132.       this.attrStart = false;
  133.       this.attrName = null;
  134.       this.nsStart = false;
  135.       this.nsUri = null;
  136.       this.isFirstGroup = false;
  137.    }
  138.  
  139.    public void endDocument() {
  140.    }
  141.  
  142.    public void processingInstruction(String var1, String var2) throws SAXException {
  143.       ProcessingInstruction var3 = new ProcessingInstruction(var1, var2);
  144.       if (this.inProlog) {
  145.          ((BaseDeclaration)var3).setIsInProlog(true);
  146.       }
  147.  
  148.       this.schema.insertDeclaration(var3, (BaseDeclaration)null);
  149.    }
  150.  
  151.    public void startElement(String var1, AttributeList var2) {
  152.       this.inProlog = false;
  153.       this.parseElement(var1, var2);
  154.    }
  155.  
  156.    public void parseElement(String var1, AttributeList var2) {
  157.       if (!var1.equals("DCD")) {
  158.          if (var1.equals("ElementDef")) {
  159.             String var3 = var2.getValue("Type");
  160.             String var4 = var2.getValue("Model");
  161.             String var5 = var2.getValue("Content");
  162.             String var6 = var2.getValue("Datatype");
  163.             String var7 = var2.getValue("Fixed");
  164.             if (var4 == null) {
  165.                var4 = new String("data");
  166.             }
  167.  
  168.             if (this.elemDecls.containsKey(var3)) {
  169.                this.currentElemDecl = (ElementDeclaration)this.elemDecls.get(var3);
  170.             } else {
  171.                this.currentElemDecl = new ElementDeclaration(var3, 3);
  172.                this.elemDecls.put(var3, this.currentElemDecl);
  173.             }
  174.  
  175.             for(int var8 = 0; var8 < var2.getLength(); ++var8) {
  176.                String var9 = var2.getName(var8);
  177.                if (var9.indexOf(":") != -1 && !var9.equals("RDF:Order")) {
  178.                   String var10 = var2.getValue(var8);
  179.                   this.currentElemDecl.putMetaProp(var9, var10);
  180.                }
  181.             }
  182.  
  183.             this.currentCM = this.currentElemDecl.getContentModel();
  184.             if (((String)var4).equals("Empty")) {
  185.                this.currentCM.setContentModel(3);
  186.                this.cmClosed = true;
  187.             } else if (((String)var4).equals("Data")) {
  188.                this.currentCM.setContentModel(5);
  189.                if (var6 != null) {
  190.                   this.currentElemDecl.setDataType(DataTypeFactory.createDataType(var6));
  191.                }
  192.  
  193.                this.cmClosed = true;
  194.             } else if (((String)var4).equals("Any")) {
  195.                this.currentCM.setContentModel(2);
  196.             } else {
  197.                if (((String)var4).equals("Elements")) {
  198.                   this.currentCM.setContentModel(6);
  199.                } else if (((String)var4).equals("Mixed")) {
  200.                   this.currentCM.setContentModel(4);
  201.                }
  202.  
  203.                this.isFirstGroup = true;
  204.                this.contentModels.push(this.currentCM.getRootGroup());
  205.             }
  206.          } else if (var1.equals("AttributeDef")) {
  207.             String var16 = var2.getValue("Name");
  208.             String var20 = var2.getValue("Global");
  209.             String var24 = var2.getValue("Datatype");
  210.             String var28 = var2.getValue("Occurs");
  211.             String var30 = var2.getValue("ID-Role");
  212.             String var31 = var2.getValue("Default");
  213.             String var32 = var2.getValue("Fixed");
  214.             DataType var33 = null;
  215.             if (var24 != null) {
  216.                if (var24.equals("enumeration")) {
  217.                   var33 = DataTypeFactory.createDataType(10);
  218.                } else {
  219.                   var33 = DataTypeFactory.createDataType(var24.toUpperCase());
  220.                }
  221.             } else if (var30 != null) {
  222.                if (!var30.equals("ID") && !var30.equals("IDREF") && !var30.equals("IDREFS")) {
  223.                   this.error(var30, 239, this.locator.getLineNumber(), this.locator.getColumnNumber());
  224.                } else {
  225.                   var33 = DataTypeFactory.createDataType(var30);
  226.                }
  227.             } else {
  228.                var33 = DataTypeFactory.createDataType(1);
  229.             }
  230.  
  231.             boolean var11 = false;
  232.             if (var28 != null && var28.equals("Required")) {
  233.                var11 = true;
  234.             } else if (var32 != null) {
  235.                var11 = true;
  236.             }
  237.  
  238.             AttributeDeclaration var12 = new AttributeDeclaration(this.currentElemDecl, var16, var33, (Vector)null, var11, var31);
  239.             if (var20 != null && var20.equals("True")) {
  240.                this.currentAttrs.put(var16, var12);
  241.             } else {
  242.                this.elemDeclAttrs.addElement(var12);
  243.             }
  244.  
  245.             for(int var13 = 0; var13 < var2.getLength(); ++var13) {
  246.                String var14 = var2.getName(var13);
  247.                if (var14.indexOf(":") != -1 && !var14.equals("RDF:Order")) {
  248.                   String var15 = var2.getValue(var13);
  249.                   ((BaseDeclaration)var12).putMetaProp(var14, var15);
  250.                }
  251.             }
  252.  
  253.             this.currentAttrDecl = var12;
  254.          } else if (var1.equals("Namespace")) {
  255.             this.nsStart = true;
  256.          } else if (var1.equals("Values")) {
  257.             this.enumStart = true;
  258.          } else if (var1.equals("Attribute")) {
  259.             this.attrStart = true;
  260.          } else if (var1.equals("Group")) {
  261.             Debug.assert(!this.cmClosed, String.valueOf(this.currentElemDecl.getName()).concat(String.valueOf(" shouldn't have any content terms")));
  262.             String var17 = var2.getValue("Occurs");
  263.             String var21 = var2.getValue("RDF:Order");
  264.             if (var21 == null) {
  265.                var21 = "Seq";
  266.             }
  267.  
  268.             if (this.isFirstGroup) {
  269.                this.cmConnectors.push(this.getConnector(var21));
  270.                this.isFirstGroup = false;
  271.             } else {
  272.                ContentModelTerm var25 = new ContentModelTerm();
  273.                var25.setOccurance(this.getOccurance(var17));
  274.                var25.setConnection(this.getCurrentConnection());
  275.                this.getCurrentParent().addTerm(var25);
  276.                this.contentModels.push(var25);
  277.                this.cmConnectors.push(this.getConnector(var21));
  278.             }
  279.          } else if (var1.equals("Element")) {
  280.             Debug.assert(!this.cmClosed, String.valueOf(this.currentElemDecl.getName()).concat(String.valueOf(" shouldn't have any content terms")));
  281.             this.elemStart = true;
  282.          } else if (var1.equals("Description")) {
  283.             this.commentStart = true;
  284.          } else if (var1.equals("ExternalEntityDef")) {
  285.             this.entityName = var2.getValue("Name");
  286.             String var18 = var2.getValue("SystemID");
  287.             String var22 = var2.getValue("PublicID");
  288.             URI var26 = new URI((URI)null, var18);
  289.             ExternalGEDeclaration var29 = new ExternalGEDeclaration(this.entityName, var22, var26);
  290.             this.schema.insertDeclaration(var29, (BaseDeclaration)null);
  291.          } else if (var1.equals("InternalEntityDef")) {
  292.             String var19 = var2.getValue("Name");
  293.             String var23 = var2.getValue("Value");
  294.             InternalGEDeclaration var27 = new InternalGEDeclaration(var19, var23);
  295.             this.schema.insertDeclaration(var27, (BaseDeclaration)null);
  296.          } else {
  297.             this.error(var1, 239, this.locator.getLineNumber(), this.locator.getColumnNumber());
  298.          }
  299.       }
  300.  
  301.    }
  302.  
  303.    private char getCurrentConnection() {
  304.       return (Character)this.cmConnectors.peek();
  305.    }
  306.  
  307.    private ContentModelTerm getCurrentParent() {
  308.       return (ContentModelTerm)this.contentModels.peek();
  309.    }
  310.  
  311.    public void endElement(String var1) {
  312.       if (var1.equals("ElementDef")) {
  313.          this.schema.insertDeclaration(this.currentElemDecl, (BaseDeclaration)null);
  314.          this.currentElemDecl = null;
  315.  
  316.          for(int var2 = 0; var2 < this.elemDeclAttrs.size(); ++var2) {
  317.             AttributeDeclaration var3 = (AttributeDeclaration)this.elemDeclAttrs.elementAt(var2);
  318.             this.schema.insertDeclaration(var3, (BaseDeclaration)null);
  319.          }
  320.  
  321.          this.elemDeclAttrs.removeAllElements();
  322.          if (!this.contentModels.empty()) {
  323.             this.contentModels.removeAllElements();
  324.          }
  325.  
  326.          if (!this.cmConnectors.empty()) {
  327.             this.cmConnectors.removeAllElements();
  328.          }
  329.  
  330.          this.cmClosed = false;
  331.       } else if (var1.equals("Group")) {
  332.          if (this.cmConnectors.size() > 1) {
  333.             this.cmConnectors.pop();
  334.          }
  335.  
  336.          if (this.contentModels.size() > 1) {
  337.             ContentModelTerm var6 = (ContentModelTerm)this.contentModels.pop();
  338.          }
  339.       } else if (var1.equals("Description")) {
  340.          this.commentStart = false;
  341.          if (this.currentAttrDecl != null) {
  342.             this.currentAttrDecl.addComment(new Comment(this.commentContent));
  343.          } else if (this.currentElemDecl != null) {
  344.             this.currentElemDecl.addComment(new Comment(this.commentContent));
  345.          } else {
  346.             Debug.assert(false, "cannot add comment if it doesn't belong to any element declaration");
  347.          }
  348.  
  349.          this.commentKind = null;
  350.          this.commentContent = null;
  351.       } else if (var1.equals("InternalEntityDef") && this.internalGEStart) {
  352.          InternalGEDeclaration var12 = new InternalGEDeclaration(this.entityName, this.entityValue);
  353.          this.schema.insertDeclaration(var12, (BaseDeclaration)null);
  354.          this.internalGEStart = false;
  355.          this.entityName = null;
  356.          this.entityValue = null;
  357.       } else if (var1.equals("Element")) {
  358.          String var7 = new String(this.elemRefName);
  359.          if (this.elemDecls.containsKey(var7)) {
  360.             ElementDeclaration var13 = (ElementDeclaration)this.elemDecls.get(var7);
  361.          } else if (var7.indexOf(":") > 0) {
  362.             String var4 = var7.substring(0, var7.indexOf(":"));
  363.             String var5 = var7.substring(var7.indexOf(":") + 1, var7.length());
  364.             if (!this.namespaces.contains(var4)) {
  365.                this.error(String.valueOf(String.valueOf(var7).concat(String.valueOf(", "))).concat(String.valueOf(var4)), 242, this.locator.getLineNumber(), this.locator.getColumnNumber());
  366.             }
  367.          } else {
  368.             ElementDeclaration var14 = new ElementDeclaration(var7, 3);
  369.             this.elemDecls.put(var7, var14);
  370.          }
  371.  
  372.          char var17 = 0;
  373.          char var18 = this.getCurrentConnection();
  374.          this.getCurrentParent().addTerm(new ContentModelTerm(new TypeRef(var7), var17, var18));
  375.          this.elemStart = false;
  376.          this.elemRefName = null;
  377.       } else if (var1.equals("Values")) {
  378.          Vector var8 = null;
  379.          if (this.attrConstraints != null) {
  380.             var8 = StringUtilities.parseNames(this.attrConstraints);
  381.          }
  382.  
  383.          if (this.currentAttrDecl != null) {
  384.             this.currentAttrDecl.setChoices(var8);
  385.          }
  386.  
  387.          this.attrConstraints = null;
  388.          this.enumStart = false;
  389.       } else if (var1.equals("AttributeDef")) {
  390.          this.currentAttrDecl = null;
  391.       } else if (var1.equals("Attribute")) {
  392.          if (this.currentAttrs.containsKey(this.attrName)) {
  393.             AttributeDeclaration var9 = (AttributeDeclaration)this.currentAttrs.get(this.attrName);
  394.             AttributeDeclaration var15 = (AttributeDeclaration)var9.clone(this.currentElemDecl);
  395.             this.elemDeclAttrs.addElement(var15);
  396.          } else if (this.attrName.indexOf(":") > 0) {
  397.             String var10 = this.attrName.substring(0, this.attrName.indexOf(":"));
  398.             String var16 = this.attrName.substring(this.attrName.indexOf(":") + 1, this.attrName.length());
  399.             if (!this.namespaces.contains(var10)) {
  400.                this.error(String.valueOf(String.valueOf(this.attrName).concat(String.valueOf(", "))).concat(String.valueOf(var10)), 241, this.locator.getLineNumber(), this.locator.getColumnNumber());
  401.             }
  402.          }
  403.  
  404.          this.attrStart = false;
  405.          this.attrName = null;
  406.       } else if (var1.equals("Namespace")) {
  407.          NamespaceDeclaration var11 = new NamespaceDeclaration((String)null, this.nsUri);
  408.          this.schema.insertDeclaration(var11, (BaseDeclaration)null);
  409.          this.nsStart = false;
  410.          this.nsUri = null;
  411.       }
  412.  
  413.    }
  414.  
  415.    public void characters(char[] var1, int var2, int var3) throws SAXException {
  416.       if (this.commentStart) {
  417.          this.commentContent = String.valueOf(var1, var2, var3);
  418.       } else if (this.internalGEStart) {
  419.          this.entityValue = this.entityValue.concat(String.valueOf(var1, var2, var3));
  420.       } else if (this.elemStart) {
  421.          this.elemRefName = String.valueOf(var1, var2, var3);
  422.       } else if (this.enumStart) {
  423.          this.attrConstraints = String.valueOf(var1, var2, var3);
  424.       } else if (this.attrStart) {
  425.          this.attrName = String.valueOf(var1, var2, var3);
  426.       } else if (this.nsStart) {
  427.          this.nsUri = String.valueOf(var1, var2, var3);
  428.       } else {
  429.          String var4 = new String(String.valueOf(var1, var2, var3).trim());
  430.          if (var4.length() > 0) {
  431.             this.error(var4, 239, this.locator.getLineNumber(), this.locator.getColumnNumber());
  432.          }
  433.       }
  434.  
  435.    }
  436.  
  437.    protected char getOccurance(Object var1) {
  438.       char var2 = 0;
  439.       if (var1 != null) {
  440.          if (((String)var1).equals("Required")) {
  441.             var2 = 0;
  442.          } else if (((String)var1).equals("Optional")) {
  443.             var2 = '?';
  444.          } else if (((String)var1).equals("ZeroOrMore")) {
  445.             var2 = '*';
  446.          } else if (((String)var1).equals("OneOrMore")) {
  447.             var2 = '+';
  448.          }
  449.       }
  450.  
  451.       return var2;
  452.    }
  453.  
  454.    protected Character getConnector(Object var1) {
  455.       Character var2 = new Character(',');
  456.       if (((String)var1).equals("Seq")) {
  457.          var2 = new Character(',');
  458.       } else if (((String)var1).equals("Alt")) {
  459.          var2 = new Character('|');
  460.       }
  461.  
  462.       return var2;
  463.    }
  464. }
  465.